package br.com.pi.SmartFast.controler;

import br.com.pi.SmartFast.model.FormatoDeNumeros;
import br.com.pi.SmartFast.model.Mesa;
import br.com.pi.SmartFast.model.Pedidos;
import br.com.pi.SmartFast.model.PedidosDAO;
import java.sql.ResultSet;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Alessandro
 */
public class ControleFecharCaixa {

    private JTable tb_produtos;
    private JLabel lb_total;
    private int n_mesa = new ControleTelaCardapio().n_mesa;
    private PedidosDAO dao = new PedidosDAO();
    private JFrame tela;

    public ControleFecharCaixa(JTable tb_produtos, JLabel lb_total, JFrame tela) {
        this.tb_produtos = tb_produtos;
        this.lb_total = lb_total;
        this.tela = tela;
    }

    public void telaAoAbrir() {
        try {           
                this.tela.setExtendedState(JFrame.MAXIMIZED_BOTH);
                if (! this.getVerificaPedidosAtendidos()) {
                    this.getInformacoesPedidoMesa();
                } else {
                    JOptionPane.showMessageDialog(null, "Existem pedidos a serem atendidos ", "Informações de Pedidos"
                            + "", JOptionPane.INFORMATION_MESSAGE);
                    this.tela.setVisible(false);
                }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel carregar informações do Banco!!", "Fechamento de "
                    + "Mesa", JOptionPane.ERROR_MESSAGE);
        }

    }

    public void botaoFecharPedidoAoclicar() {
        try {
            this.setFecharPedido();
            this.getInformacoesPedidoMesa();
            this.tela.setVisible(false);
        } catch (Exception e) {
        }
    }

    public void botaoAbrirConta() {
        try {
            this.setAbrirConta();
            this.getInformacoesPedidoMesa();
            this.tela.setVisible(false);
        } catch (Exception e) {
        }
    }

    private void getInformacoesPedidoMesa() throws Exception {

        int in = 0;
        double soma = 0;
        for (int i = 0; i < this.tb_produtos.getRowCount(); i++) {
            for (int j = 0; j < this.tb_produtos.getColumnCount(); j++) {
                this.tb_produtos.setValueAt(null, i, j);
            }
        }
        String sql = "select prod.nome as produto , ped.quantidade_prod as quantidade ,ped.custo_produto as custo from"
                + " pedidos as ped, produtos as prod where"
                + " ped.fk_mesa = " + this.n_mesa + " and "
                + " ped.pedido_fechado is false and"
                + " ped.ped_atendido is true and"
                + " ped.fk_produtos = prod.id_produtos ";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            do {
                if (this.tb_produtos.getRowCount() == in) {
                    ((DefaultTableModel) this.tb_produtos.getModel()).addRow(new Vector());
                }

                this.tb_produtos.setValueAt(rs.getString("produto"), in, 0);
                this.tb_produtos.setValueAt(rs.getInt("quantidade"), in, 1);
                this.tb_produtos.setValueAt(rs.getFloat("custo"), in++, 2);

                soma += (rs.getInt("quantidade") * rs.getDouble("custo"));
            } while (rs.next());


            this.lb_total.setText("TOTAL A PAGAR: \n " + new FormatoDeNumeros(soma).getValorMonetario());

        }

    }

    private boolean getVerificaPedidosAtendidos() throws Exception {

        boolean verifica = false;//não existem pedidos a serem atendidos

        String sql = "select id_pedidos from pedidos where fk_mesa = " + this.n_mesa + " "
                + " and ped_atendido is false ";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            verifica = true;
        }

        return verifica;

    }

    private boolean getVerificaPedidosCadastrados() throws Exception {

        boolean verifica = false;//não existem pedidos a serem atendidos

        String sql = "select quantidade_prod from pedidos where fk_mesa = " + this.n_mesa + " "
                + " and ped_atendido is true and"
                + " quantidade_prod > 0 "
                + " and ";

        ResultSet rs = dao.getDadosTabela(sql);

        if (rs.next()) {
            verifica = true;
        }
        return verifica;

    }

    private void setFecharPedido() throws Exception {

        Pedidos ped = new Pedidos();
        Mesa mes = new Mesa();
        PedidosDAO pdao = new PedidosDAO();

        mes.setCod_mesa(n_mesa);

        ped.setMesa(mes);
        ped.setPedido_Fechado(true);

        pdao.setEditarPedidoFechado(ped);

        JOptionPane.showMessageDialog(null, "Favor dirigir-se ao Caixa ...", "Fechamento de Conta", JOptionPane.INFORMATION_MESSAGE);
    }

    private void setAbrirConta() throws Exception {

        Pedidos ped = new Pedidos();
        Mesa mes = new Mesa();
        PedidosDAO pdao = new PedidosDAO();

        mes.setCod_mesa(n_mesa);

        ped.setMesa(mes);
        ped.setPedido_Fechado(false);
        ped.setProd_pago(false);

        pdao.setAbrirPedidoFechado(ped);

        JOptionPane.showMessageDialog(null, "Conta aberta\nEsteja a vontade!!", "Fechamento de Conta", JOptionPane.INFORMATION_MESSAGE);

    }
}
